package com.example.rabbitmqsimple.producer;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * RabbitMQ 简单模式（Hello World）的消息生产者
 * 演示最基础的消息发送流程：连接到RabbitMQ服务器，发送消息到指定队列
 */
public class Producer_HelloWorld {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 创建连接工厂，用于配置RabbitMQ连接信息
        ConnectionFactory factory = new ConnectionFactory();

        // 2. 设置RabbitMQ服务器连接参数
        factory.setHost("localhost");      // 服务器主机地址（本地）
        factory.setPort(5672);            // 服务器端口（默认AMQP端口）
        factory.setVirtualHost("/");      // 虚拟主机（默认）
        factory.setUsername("guest");     // 用户名（默认）
        factory.setPassword("guest");     // 密码（默认）

        // 3. 通过工厂创建与RabbitMQ服务器的连接
        Connection connection = factory.newConnection();

        // 4. 创建信道（Channel），所有消息操作都通过信道进行
        Channel channel = connection.createChannel();

        // 5. 声明要发送消息的队列（确保队列存在，与消费者队列匹配）
        // 参数说明：
        // - queue: 队列名称 "hello_world"
        // - durable: 是否持久化（true表示队列在服务器重启后仍存在）
        // - exclusive: 是否排他（false表示允许其他连接访问）
        // - autoDelete: 是否自动删除（false表示不自动删除）
        // - arguments: 额外参数（null表示使用默认配置）
        channel.queueDeclare("hello_world", true, false, false, null);

        // 6. 定义要发送的消息内容
        String body = "Hello RabbitMQ!";

        // 7. 发送消息到指定队列
        // 参数说明：
        // - exchange: 交换机名称（空字符串表示使用默认交换机）
        // - routingKey: 路由键（简单模式下设置为队列名称，默认交换机根据路由键匹配队列）
        // - props: 消息属性（null表示使用默认属性）
        // - body: 消息体（字节数组形式）
        channel.basicPublish("", "hello_world", null, body.getBytes());
    }
}